home *** CD-ROM | disk | FTP | other *** search
- PROGRAM Fractal;
- {A fractal drawing demonstration program for THOR's windowlib
- © 1997 THOR Software}
-
- {$I "include:utils/windowlib.i"}
-
- CONST
- maxlevel = 10; {maximal level of iterations}
-
- TYPE
- {an affine mapping: apply matrix plus shift}
- AffineMapping = RECORD
- LinearMapping : ARRAY[1..2,1..2] OF REAL;
- Movement : ARRAY[1..2] OF REAL;
- END;
-
- {a point in space}
- Point = RECORD
- x : REAL;
- y : REAL;
- END;
-
-
- VAR
- maps : ARRAY[1..4] OF AffineMapping;
- level : INTEGER;
- window : WindowPtr;
- base : Point;
-
-
-
- {apply mapping to a point}
- PROCEDURE MapPoint(m : AffineMapping;VAR p : Point);
- BEGIN
- p.x:=p.x*m.LinearMapping[1][1]+p.y*m.LinearMapping[1][2]+m.Movement[1];
- p.y:=p.x*m.LinearMapping[2][1]+p.y*m.LinearMapping[2][2]+m.Movement[2];
- END;
-
- {plot a point}
- PROCEDURE PlotPoint(w : WindowPtr;p : Point);
- BEGIN
- Color(w,1); {choose pen}
- Plot(w,p.x*384+120,-p.y*192+180); {scale & plot the point}
- END;
-
- {iterate down the tree}
- PROCEDURE Iterate(p : Point);
- VAR
- psave : Point;
-
- BEGIN
- level:=level+1;
- IF level>=maxlevel THEN
- PlotPoint(window,p)
- ELSE BEGIN
- psave:=p;
- MapPoint(maps[1],psave);
- Iterate(psave);
-
- psave:=p;
- MapPoint(maps[2],psave);
- Iterate(psave);
-
- psave:=p;
- MapPoint(maps[3],psave);
- Iterate(psave);
-
- psave:=p;
- MapPoint(maps[4],psave);
- Iterate(psave);
- END;
-
- level:=level-1;
- END;
-
-
- {main program}
- BEGIN
- InitGraphics; {setup the gfx system}
-
- {setup the mapping}
- WITH maps[1] DO BEGIN
- LinearMapping[1][1]:=0.64987;
- LinearMapping[1][2]:=-0.013;
- LinearMapping[2][1]:=0.013;
- LinearMapping[2][2]:=0.64987;
- Movement[1]:=0.175;
- Movement[2]:=0.0;
- END;
-
- WITH maps[2] DO BEGIN
- LinearMapping[1][1]:=0.64948;
- LinearMapping[1][2]:=-0.026;
- LinearMapping[2][1]:=0.026;
- LinearMapping[2][2]:=0.64948;
- Movement[1]:=0.165;
- Movement[2]:=0.325;
- END;
-
-
- WITH maps[3] DO BEGIN
- LinearMapping[1][1]:=0.3182;
- LinearMapping[1][2]:=-0.3182;
- LinearMapping[2][1]:=0.3182;
- LinearMapping[2][2]:=0.3182;
- Movement[1]:=0.2;
- Movement[2]:=0.0;
- END;
-
-
- WITH maps[4] DO BEGIN
- LinearMapping[1][1]:=-0.3182;
- LinearMapping[1][2]:=0.3182;
- LinearMapping[2][1]:=0.3182;
- LinearMapping[2][2]:=0.3182;
- Movement[1]:=0.8;
- Movement[2]:=0.0;
- END;
-
- {open a window}
- window:=OpenScreenWindow(NIL,0,0,640,200,2+4+8,"Fractal Generator");
- IF window<>NIL THEN BEGIN
- Color(window,1); {choose pen}
- base.x:=0.0;
- base.y:=0.0;
- level:=0;
- Iterate(base); {draw the stuff}
-
- WaitForClose(window); {wait until user closes}
- CloseAWindow(window); {close the window}
- END;
-
- ExitGraphics; {cleanup gfx system}
- END.
-